package com.zeyu.soc.log.tools;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

/**
 * 定义几个常用的宏指令.
 */
public class MacroUtils {

	// ================================================================
	// Constants
	// ================================================================

	/** 指令对应表 */
	private static Map<String, String> MACRO_MAPPING = new HashMap<String, String>();

	static {
		// console 输出
		MACRO_MAPPING.put("$sysout", "System.out.println");
		// 日志输出位置转换
		MACRO_MAPPING.put("$trace", "com.zeyu.soc.log.tools.Trace.trace");
		// 输出对象转JSON
		MACRO_MAPPING.put("$json", "com.zeyu.soc.log.utils.JsonUtils.toJson");
	}

	// ================================================================
	// Fields
	// ================================================================

	// ================================================================
	// Constructors
	// ================================================================

	// ================================================================
	// Methods from/for super Interfaces or SuperClass
	// ================================================================

	// ================================================================
	// Public or Protected Methods
	// ================================================================

	/**
	 * 转换输入语句，替换预定义宏指令.
	 */
	public static String translate(String sourceCode) {
		if (null == sourceCode) {
			return sourceCode;
		}
		// 替换
		String distCode = sourceCode;
		for (Entry<String, String> entry : MACRO_MAPPING.entrySet()) {
			String key = entry.getKey();
			String value = entry.getValue();
			distCode = distCode.replace(key, value);
		}
		return distCode;
	}

	/**
	 * 转换注入新的值.
	 */
	public static <T> T translate(T obj) {
		if (null == obj) {
			return null;
		}

		Class<?> clazz = obj.getClass();

		Method[] methods = clazz.getMethods();
		for (Method method : methods) {
			String methodName = method.getName();

			if (methodName.startsWith("get") && !methodName.equals("getClass")
					&& String.class.isAssignableFrom(method.getReturnType())) {
				try {
					// 获取旧值，转换后设置新值.
					String value = (String) method.invoke(obj, new Object[] {});
					String newValue = translate(value);
					Method setter = clazz.getMethod(methodName.replaceFirst("get", "set"), String.class);
					setter.invoke(obj, new Object[] { newValue });

				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
		return obj;
	}

	/**
	 * 为插入语句加入try-catch
	 */
	public static String safeInsertTemplate(String sourceCode) {
		if (sourceCode == null || sourceCode.trim().equals("")) {
			return "";
		} else {
			return " try{ " + sourceCode + " }catch(Throwable e){ } ";
		}
	}

	// ================================================================
	// Getter & Setter
	// ================================================================

	// ================================================================
	// Private Methods
	// ================================================================

	// ================================================================
	// Inner or Anonymous Class
	// ================================================================

	// ================================================================
	// Test Methods
	// ================================================================
}
